#include <stdio.h>            // 标准输入输出头文件
#include <stdlib.h>           // 标准库头文件
#include <string.h>           // 字符串操作头文件
#include <fcntl.h>            // 文件控制定义，用于 open()
#include <errno.h>            // 错误号定义，用于 errno
#include <unistd.h>           // UNIX 标准函数定义，用于 close()
#include <dirent.h>           // 目录操作头文件

#define DEVICE_DIR "/sys/bus/w1/devices/" // DS18B20 设备所在目录
#define PREFIX "28-"                      // 设备目录前缀

// 读取 DS18B20 传感器温度的函数
float read_temperature()
{
    int fd = -1;         // 文件描述符初始化
    char buf[128];       // 缓冲区，用于存储读取的数据
    char *ptr = NULL;    // 字符指针，用于查找温度数据
    float temp = 0.0;    // 温度值初始化
    char device_file[256]; // 存储完整的设备文件路径
    DIR *dir;
    struct dirent *entry;

    // 打开设备目录
    dir = opendir(DEVICE_DIR);
    if (!dir)
    {
        printf("无法打开目录 %s: %s\n", DEVICE_DIR, strerror(errno));
        return -1;
    }

    // 遍历目录，查找以 "28-" 开头的设备
    while ((entry = readdir(dir)) != NULL)
    {
        if (strncmp(entry->d_name, PREFIX, strlen(PREFIX)) == 0)
        {
            // 构造完整的设备文件路径
            snprintf(device_file, sizeof(device_file), "%s%s/w1_slave", DEVICE_DIR, entry->d_name);
            printf("找到设备文件: %s\n", device_file);
            break;
        }
    }

    closedir(dir);

    // 如果没有找到以 "28-" 开头的设备，返回错误
    if (!entry)
    {
        printf("未找到以 %s 开头的设备。\n", PREFIX);
        return -1;
    }

    // 打开设备文件
    fd = open(device_file, O_RDONLY);
    if (fd < 0)
    {
        printf("无法打开文件 %s: %s\n", device_file, strerror(errno)); // 打印错误信息
        return -1;
    }

    // 清空缓冲区
    memset(buf, 0, sizeof(buf));

    // 读取文件内容
    if (read(fd, buf, sizeof(buf) - 1) < 0)
    {
        printf("读取数据失败: %s\n", strerror(errno)); // 打印错误信息
        close(fd); // 关闭文件
        return -1;
    }

    printf("读取的内容: %s\n", buf); // 打印读取的内容

    // 查找温度数据
    ptr = strstr(buf, "t=");
    if (!ptr)
    {
        printf("未找到 't=' 字符串。\n"); // 打印错误信息
        close(fd); // 关闭文件
        return -1;
    }

    ptr += 2; // 移动指针到温度值的位置
    printf("温度字符串: %s\n", ptr); // 打印温度字符串

    // 将字符串转换为浮点数，并转换为摄氏度
    temp = atof(ptr) / 1000.0;
    printf("温度: %.2f°C\n", temp); // 打印温度值

    close(fd); // 关闭文件

    return temp; // 返回温度值
}


